package coms.mianshi.hashmap;

import java.util.*;

/**
 * @program: item_02
 * @description: HashMapTest
 * @author: LL
 * @create: 2021-03-03 11:22
 */
public class HashMapTest {

    //获取某个数据
    public void test(final Map<String, Integer> map) {
        System.out.println(map.get("java"));
    }

    /**
     * 获取全部数据
     * 核心思想：
     * 步骤1：获得key-value对（Entry） 或 key 或 value的Set集合
     * 步骤2：遍历上述Set集合(使用for循环 、 迭代器（Iterator）均可)
     * 方法共有3种：分别针对 key-value对（Entry） 或 key 或 value
     * <p>
     * 注：对于遍历方式，推荐使用针对 key-value对（Entry）的方式：效率高
     * 原因：
     * 1. 对于 遍历keySet 、valueSet，实质上 = 遍历了2次：1 = 转为 iterator 迭代器遍历、2 = 从 HashMap 中取出 key 的 value 操作（通过 key 值 hashCode 和 equals 索引）
     * 2. 对于 遍历 entrySet ，实质 = 遍历了1次 = 获取存储实体Entry（存储了key 和 value ）
     *
     * @param map
     */
    //方法1
    public void test1(final Map<String, Integer> map) {
        //获取key-value的set集合，在遍历
        System.out.println("方法1");
        //1.获取key-value对（Entry）的Set集合
        final Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
        //2.遍历Set集合，获取key-value
        //for循环遍历
        for (final Map.Entry<String, Integer> entry : entrySet) {
            System.out.print(entry.getKey() + "--");
            System.out.println(entry.getValue());
        }

        System.out.println("-----------------------------");

        //2.通过迭代器，先获取key-value对（Entry）的Iterator，在循环遍历
        final Iterator iterator = entrySet.iterator();
        while (iterator.hasNext()) {
            //遍历时，需要获取entry，再分别获取key，value
            final Map.Entry entry = (Map.Entry) iterator.next();
            System.out.print(entry.getKey() + "--");
            System.out.println(entry.getValue());
        }
    }

    //方法2
    public void test2(final Map<String, Integer> map) {
        //获取key的set集合，在遍历
        System.out.println("方法2");
        //1.获取key的Set集合
        final Set<String> keySet = map.keySet();
        //2.遍历Set集合，从而获取key,在获取Value
        //2.1通过for循环
        for (final String key : keySet) {
            System.out.print(key + "--");
            System.out.println(map.get(key));
        }

        System.out.println("---------------------------");

        //2.2通过迭代器：先获取key的Iterator,在循环遍历
        final Iterator<String> iterator = keySet.iterator();
        String key = null;
        while (iterator.hasNext()) {
            key = iterator.next();
            System.out.print(key + "--");
            System.out.println(map.get(key));
        }
    }

    //方法3：获取value的Set集合，在遍历
    public void test3(final Map<String, Integer> map) {
        System.out.println("方法3");
        //1.获取value的set集合
        final Collection<Integer> valueSet = map.values();
        //2.遍历Set集合，从而获取value
        //2.1获取values的iterator
        final Iterator<Integer> iterator = valueSet.iterator();
        //2.2遍历，直接获取value
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }


    public static void main(final String[] args) {

        final Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("android", 1);
        map.put("java", 2);
        map.put("HarmonyOS", 3);
        map.put("数据挖掘", 4);
        map.put("产品经理", 5);

        final HashMapTest hashMapTest = new HashMapTest();
        hashMapTest.test3(map);
    }

}
